package br.com.damazzy.negocio.servico;

import java.util.ArrayList;
import java.util.List;

import br.com.damazzy.dto.RetornoDTO;
import br.com.damazzy.negocio.entidade.Pessoa;
import br.com.damazzy.negocio.entidade.Uf;
import br.com.damazzy.negocio.persistencia.dao.DamazzyDaoFactory;
import br.com.damazzy.negocio.persistencia.dao.PessoaDao;
import br.com.damazzy.negocio.persistencia.dao.UfDao;
import br.com.damazzy.negocio.servico.conversor.DamazzyConversor;
import br.com.damazzy.vo.PessoaVO;

import com.ibm.icu.text.SimpleDateFormat;

public class ServicoPessoa implements ServicoCrudDamazzy<PessoaVO, RetornoDTO>, DamazzyConversor<Pessoa, PessoaVO> {
	
	private static final String LISTA_UFS = "listaUfs";
	private static final String VO = "vo";
	private static final String LISTA = "lista";
	private static SimpleDateFormat sdfData = new SimpleDateFormat("dd/MM/yyyy");
	
	private PessoaDao pessoaDao = DamazzyDaoFactory.getInstance().criarPessoaDao();
	private UfDao ufDao = DamazzyDaoFactory.getInstance().criarUfDao();
	
	public RetornoDTO obterDadosSelecao() throws Exception {
		
		RetornoDTO dto = new RetornoDTO();
	
		List<Uf> ufs = ufDao.listar();
		List<PessoaVO> ufsVO = converterUfEntidadeVO(ufs);
		
		dto.dados.put(LISTA_UFS, ufsVO);
		
		return dto;
	}
	
	public RetornoDTO obterDados() throws Exception {
		
		RetornoDTO dto = obterDadosSelecao();
		
		return dto;
	}

	public RetornoDTO alterar(PessoaVO vo) throws Exception {
		
		RetornoDTO dto = new RetornoDTO();
			
		Pessoa p = converterVOEntidade(vo);
		p = pessoaDao.alterar(p);
		
		PessoaVO pessoaVO = converterEntidadeVO(p); 
		
		dto.dados.put(VO, pessoaVO);
		
		return dto;
	}

	public RetornoDTO excluir(PessoaVO vo) throws Exception {
			
		Pessoa p = converterVOEntidade(vo);
		pessoaDao.excluir(p.getIdPessoa());
		
		return new RetornoDTO();
	}

	public RetornoDTO incluir(PessoaVO vo) throws Exception {

		Pessoa p = converterVOEntidade(vo);
		p = pessoaDao.incluir(p);
		
		PessoaVO pessoaVO = converterEntidadeVO(p);
		
		RetornoDTO dto = new RetornoDTO();
		dto.dados.put(VO, pessoaVO);
		
		return dto;
	}

	public RetornoDTO obter(PessoaVO vo) throws Exception {
		
		RetornoDTO dto = new RetornoDTO();
		
		Pessoa p = converterVOEntidade(vo);
		p = pessoaDao.obter(p.getIdPessoa());
		
		PessoaVO pessoaVO = converterEntidadeVO(p);
		dto.dados.put(VO, pessoaVO);
		
		return dto;
	}

	public RetornoDTO pesquisar(PessoaVO vo) throws Exception {
		
		RetornoDTO dto = new RetornoDTO();
		
		Pessoa pessoaFiltro = converterVOEntidade(vo);
		List<Pessoa> pessoas = pessoaDao.pesquisar(pessoaFiltro);
		List<PessoaVO> vos = converterPessoaEntidadeVO(pessoas);
		
		dto.dados.put(LISTA, vos);
		
		return dto;
	}

	public PessoaVO converterEntidadeVO(Pessoa entidade) throws Exception {
		
		PessoaVO vo = new PessoaVO();
		
		if (entidade != null) {
			vo.setIdPessoa(entidade.getIdPessoa() != null ? entidade.getIdPessoa().toString() : null);
			vo.setNome(entidade.getNome());
			vo.setEndereco(entidade.getEndereco());
			vo.setCep(entidade.getCep() != null ? entidade.getCep().toString() : null);
			vo.setTelefone(entidade.getTelefone());
			vo.setCidade(entidade.getCidade());
			vo.setCodUf(entidade.getUf() != null ? entidade.getUf().getCodUf() : null);
			vo.setBolPessoaFisica(entidade.getBolPessoaFisica().equals(Boolean.TRUE) ? Boolean.TRUE.toString() : Boolean.FALSE.toString());
			vo.setBolAtivo(entidade.getBolAtivo().equals(Boolean.TRUE) ? Boolean.TRUE.toString() : Boolean.FALSE.toString());
			vo.setEmail(entidade.getEmail());
			vo.setDataNascimento(entidade.getDataNascimento() != null ? sdfData.format(entidade.getDataNascimento()) : null);
		}
		
		return vo;
	}

	public Pessoa converterVOEntidade(PessoaVO vo) throws Exception {
		
		Pessoa p = new Pessoa();
		
		if (vo != null) {
			p.setIdPessoa(vo.getIdPessoa() != null ? new Long(vo.getIdPessoa()) : null);
			p.setNome(vo.getNome() != null ? vo.getNome() : null);
			p.setEndereco(vo.getEndereco() != null ? vo.getEndereco() : null);
			p.setCep(vo.getCep() != null ? new Integer(vo.getCep()) : null);
			p.setTelefone(vo.getTelefone() != null ? vo.getTelefone() : null);
			p.setCidade(vo.getCidade() != null ? vo.getCidade() : null);
			
			if (vo.getCodUf() != null) {
				Uf uf = new Uf();
				uf.setCodUf(vo.getCodUf());
				p.setUf(uf);
			}
			
			p.setBolPessoaFisica(vo.getBolPessoaFisica() != null ? new Boolean(vo.getBolPessoaFisica()) : null);
			p.setBolAtivo(vo.getBolAtivo() != null ? new Boolean(vo.getBolAtivo()) : null);
			p.setEmail(vo.getEmail());
			p.setDataNascimento(vo.getDataNascimento() != null ? sdfData.parse(vo.getDataNascimento()) : null);
		}
		
		return p;
	}
	
	private List<PessoaVO> converterPessoaEntidadeVO(List<Pessoa> pessoas) throws Exception {
		
		List<PessoaVO> vos = new ArrayList<PessoaVO>();
		
		for (Pessoa p : pessoas) {
			vos.add(converterEntidadeVO(p));
		}
		
		return vos;
	}
	
	private List<PessoaVO> converterUfEntidadeVO(List<Uf> ufs) throws Exception {
		
		List<PessoaVO> vos = new ArrayList<PessoaVO>();
		
		for (Uf uf : ufs) {
			vos.add(converterEntidadeVO(uf));
		}
		
		return vos;
	}
	
	private PessoaVO converterEntidadeVO(Uf entidade) throws Exception {
		
		PessoaVO vo = new PessoaVO();
		
		if (entidade != null) {
			vo.setCodUf(entidade.getCodUf());
		}
		
		return vo;
	}
}
